{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Quick Start"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The `ssms` package serves two purposes. \n",
    "\n",
    "1. Easy access to *fast simulators of sequential sampling models*\n",
    "   \n",
    "2. Support infrastructure to construct training data for various approaches to likelihood / posterior amortization\n",
    "\n",
    "We provide two minimal examples here to illustrate how to use each of the two capabilities.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Install \n",
    "\n",
    "Let's start with *installing* the `ssms` package.\n",
    "\n",
    "You can do so by typing,\n",
    "\n",
    "`pip install git+https://github.com/AlexanderFengler/ssm_simulators`\n",
    "\n",
    "in your terminal.\n",
    "\n",
    "Below you find a basic tutorial on how to use the package."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Tutorial"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Import necessary packages\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import ssms"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Using the Simulators\n",
    "\n",
    "Let's start with using the basic simulators. \n",
    "You access the main simulators through the  `ssms.basic_simulators.simulator` function.\n",
    "\n",
    "To get an idea about the models included in `ssms`, use the `config` module.\n",
    "The central dictionary with metadata about included models sits in `ssms.config.model_config`. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['ddm',\n",
       " 'ddm_legacy',\n",
       " 'angle',\n",
       " 'weibull',\n",
       " 'levy',\n",
       " 'levy_angle',\n",
       " 'full_ddm',\n",
       " 'gamma_drift',\n",
       " 'gamma_drift_angle',\n",
       " 'ds_conflict_drift']"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Check included models\n",
    "list(ssms.config.model_config.keys())[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'name': 'levy',\n",
       " 'params': ['v', 'a', 'z', 'alpha', 't'],\n",
       " 'param_bounds': [[-3.0, 0.3, 0.1, 1.0, 0.001], [3.0, 3.0, 0.9, 2.0, 2]],\n",
       " 'boundary_name': 'constant',\n",
       " 'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>,\n",
       " 'n_params': 5,\n",
       " 'default_params': [0.0, 1.0, 0.5, 1.5, 0.1],\n",
       " 'nchoices': 2,\n",
       " 'simulator': <cyfunction levy_flexbound at 0x1562a1ff0>}"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Take an example config for a given model\n",
    "ssms.config.model_config[\"levy\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['v', 'a', 'z', 'alpha', 't']"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ssms.config.model_config[\"levy\"][\"params\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Note:**\n",
    "The usual structure of these models includes,\n",
    "\n",
    "- Parameter names (`'params'`)\n",
    "- Bounds on the parameters (`'param_bounds'`)\n",
    "- A function that defines a boundary for the respective model (`'boundary'`)\n",
    "- The name of the boundary as a string(`'boundary_name'`)\n",
    "- The number of parameters (`'n_params'`)\n",
    "- Defaults for the parameters (`'default_params'`)\n",
    "- The number of choices the process can produce (`'nchoices'`)\n",
    "- The simulator function that is attached to the model (`'simulator'`)\n",
    "\n",
    "Some models also include:\n",
    "- A function for the drift over time (`'drift'`)\n",
    "- The name of the corresponding drift as a string (`'drift_name'`)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'v': array([1.1], dtype=float32), 'a': array([1.65], dtype=float32), 'z': array([0.5], dtype=float32), 't': array([0.3], dtype=float32), 'alpha': array([1.5], dtype=float32), 'deadline': array([999.], dtype=float32)}\n",
      "{'boundary_params': {}, 'boundary_fun': <function constant at 0x1572e56c0>, 'boundary_multiplicative': True}\n",
      "{}\n",
      "{'max_t': 20, 's': 1.0, 'n_samples': 100, 'n_trials': 1, 'delta_t': 0.001, 'random_state': None, 'return_option': 'full', 'smooth': False}\n"
     ]
    },
    {
     "ename": "TypeError",
     "evalue": "levy_flexbound() takes at least 6 positional arguments (3 given)",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m/Users/afengler/Library/CloudStorage/OneDrive-Personal/proj_ssm_simulators/ssm-simulators/notebooks/basic_tutorial.ipynb Cell 11\u001b[0m line \u001b[0;36m4\n\u001b[1;32m      <a href='vscode-notebook-cell:/Users/afengler/Library/CloudStorage/OneDrive-Personal/proj_ssm_simulators/ssm-simulators/notebooks/basic_tutorial.ipynb#Y153sZmlsZQ%3D%3D?line=0'>1</a>\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mssms\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39mbasic_simulators\u001b[39;00m\u001b[39m.\u001b[39;00m\u001b[39msimulator\u001b[39;00m \u001b[39mimport\u001b[39;00m simulator\n\u001b[1;32m      <a href='vscode-notebook-cell:/Users/afengler/Library/CloudStorage/OneDrive-Personal/proj_ssm_simulators/ssm-simulators/notebooks/basic_tutorial.ipynb#Y153sZmlsZQ%3D%3D?line=1'>2</a>\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mmatplotlib\u001b[39;00m \u001b[39mimport\u001b[39;00m pyplot \u001b[39mas\u001b[39;00m plt\n\u001b[0;32m----> <a href='vscode-notebook-cell:/Users/afengler/Library/CloudStorage/OneDrive-Personal/proj_ssm_simulators/ssm-simulators/notebooks/basic_tutorial.ipynb#Y153sZmlsZQ%3D%3D?line=3'>4</a>\u001b[0m sim_out \u001b[39m=\u001b[39m simulator(\n\u001b[1;32m      <a href='vscode-notebook-cell:/Users/afengler/Library/CloudStorage/OneDrive-Personal/proj_ssm_simulators/ssm-simulators/notebooks/basic_tutorial.ipynb#Y153sZmlsZQ%3D%3D?line=4'>5</a>\u001b[0m     model\u001b[39m=\u001b[39;49m\u001b[39m\"\u001b[39;49m\u001b[39mlevy\u001b[39;49m\u001b[39m\"\u001b[39;49m,\n\u001b[1;32m      <a href='vscode-notebook-cell:/Users/afengler/Library/CloudStorage/OneDrive-Personal/proj_ssm_simulators/ssm-simulators/notebooks/basic_tutorial.ipynb#Y153sZmlsZQ%3D%3D?line=5'>6</a>\u001b[0m     theta\u001b[39m=\u001b[39;49m{\u001b[39m\"\u001b[39;49m\u001b[39mv\u001b[39;49m\u001b[39m\"\u001b[39;49m: \u001b[39m1.1\u001b[39;49m, \u001b[39m\"\u001b[39;49m\u001b[39ma\u001b[39;49m\u001b[39m\"\u001b[39;49m: \u001b[39m1.65\u001b[39;49m, \u001b[39m\"\u001b[39;49m\u001b[39mz\u001b[39;49m\u001b[39m\"\u001b[39;49m: \u001b[39m0.5\u001b[39;49m, \u001b[39m\"\u001b[39;49m\u001b[39mt\u001b[39;49m\u001b[39m\"\u001b[39;49m: \u001b[39m0.3\u001b[39;49m, \u001b[39m\"\u001b[39;49m\u001b[39malpha\u001b[39;49m\u001b[39m\"\u001b[39;49m: \u001b[39m1.5\u001b[39;49m},\n\u001b[1;32m      <a href='vscode-notebook-cell:/Users/afengler/Library/CloudStorage/OneDrive-Personal/proj_ssm_simulators/ssm-simulators/notebooks/basic_tutorial.ipynb#Y153sZmlsZQ%3D%3D?line=6'>7</a>\u001b[0m     n_samples\u001b[39m=\u001b[39;49m\u001b[39m100\u001b[39;49m,\n\u001b[1;32m      <a href='vscode-notebook-cell:/Users/afengler/Library/CloudStorage/OneDrive-Personal/proj_ssm_simulators/ssm-simulators/notebooks/basic_tutorial.ipynb#Y153sZmlsZQ%3D%3D?line=7'>8</a>\u001b[0m     smooth_unif\u001b[39m=\u001b[39;49m\u001b[39mFalse\u001b[39;49;00m,\n\u001b[1;32m      <a href='vscode-notebook-cell:/Users/afengler/Library/CloudStorage/OneDrive-Personal/proj_ssm_simulators/ssm-simulators/notebooks/basic_tutorial.ipynb#Y153sZmlsZQ%3D%3D?line=8'>9</a>\u001b[0m )\n",
      "File \u001b[0;32m~/Library/CloudStorage/OneDrive-Personal/proj_ssm_simulators/ssm-simulators/ssms/basic_simulators/simulator.py:759\u001b[0m, in \u001b[0;36msimulator\u001b[0;34m(theta, model, n_samples, delta_t, max_t, no_noise, bin_dim, bin_pointwise, smooth_unif, return_option, random_state)\u001b[0m\n\u001b[1;32m    757\u001b[0m \u001b[39mprint\u001b[39m(sim_param_dict)\n\u001b[1;32m    758\u001b[0m \u001b[39m# Call to the simulator\u001b[39;00m\n\u001b[0;32m--> 759\u001b[0m x \u001b[39m=\u001b[39m model_config[model][\u001b[39m\"\u001b[39;49m\u001b[39msimulator\u001b[39;49m\u001b[39m\"\u001b[39;49m](\n\u001b[1;32m    760\u001b[0m     \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mtheta,\n\u001b[1;32m    761\u001b[0m     \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mboundary_dict,\n\u001b[1;32m    762\u001b[0m     \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mdrift_dict,\n\u001b[1;32m    763\u001b[0m     \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49msim_param_dict,\n\u001b[1;32m    764\u001b[0m )\n\u001b[1;32m    766\u001b[0m \u001b[39m# Additional model outputs, easy to compute:\u001b[39;00m\n\u001b[1;32m    767\u001b[0m \u001b[39m# Choice probability\u001b[39;00m\n\u001b[1;32m    768\u001b[0m x[\u001b[39m\"\u001b[39m\u001b[39mchoice_p\u001b[39m\u001b[39m\"\u001b[39m] \u001b[39m=\u001b[39m np\u001b[39m.\u001b[39mzeros((n_trials, \u001b[39mlen\u001b[39m(x[\u001b[39m\"\u001b[39m\u001b[39mmetadata\u001b[39m\u001b[39m\"\u001b[39m][\u001b[39m\"\u001b[39m\u001b[39mpossible_choices\u001b[39m\u001b[39m\"\u001b[39m])))\n",
      "File \u001b[0;32msrc/cssm.pyx:1023\u001b[0m, in \u001b[0;36mcssm.levy_flexbound\u001b[0;34m()\u001b[0m\n",
      "\u001b[0;31mTypeError\u001b[0m: levy_flexbound() takes at least 6 positional arguments (3 given)"
     ]
    }
   ],
   "source": [
    "from ssms.basic_simulators.simulator import simulator\n",
    "from matplotlib import pyplot as plt\n",
    "\n",
    "sim_out = simulator(\n",
    "    model=\"levy\",\n",
    "    theta={\"v\": 1.1, \"a\": 1.65, \"z\": 0.5, \"t\": 0.3, \"alpha\": 1.5},\n",
    "    n_samples=100,\n",
    "    smooth_unif=False,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "ename": "TypeError",
     "evalue": "'NoneType' object is not callable",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m/Users/afengler/Library/CloudStorage/OneDrive-Personal/proj_ssm_simulators/ssm-simulators/notebooks/basic_tutorial.ipynb Cell 12\u001b[0m line \u001b[0;36m1\n\u001b[1;32m      <a href='vscode-notebook-cell:/Users/afengler/Library/CloudStorage/OneDrive-Personal/proj_ssm_simulators/ssm-simulators/notebooks/basic_tutorial.ipynb#Y160sZmlsZQ%3D%3D?line=6'>7</a>\u001b[0m sim_stats \u001b[39m=\u001b[39m {\u001b[39m'\u001b[39m\u001b[39mmax_t\u001b[39m\u001b[39m'\u001b[39m: \u001b[39m20\u001b[39m, \u001b[39m'\u001b[39m\u001b[39ms\u001b[39m\u001b[39m'\u001b[39m: \u001b[39m1.0\u001b[39m, \u001b[39m'\u001b[39m\u001b[39mn_samples\u001b[39m\u001b[39m'\u001b[39m: \u001b[39m100\u001b[39m, \u001b[39m'\u001b[39m\u001b[39mn_trials\u001b[39m\u001b[39m'\u001b[39m: \u001b[39m1\u001b[39m, \n\u001b[1;32m      <a href='vscode-notebook-cell:/Users/afengler/Library/CloudStorage/OneDrive-Personal/proj_ssm_simulators/ssm-simulators/notebooks/basic_tutorial.ipynb#Y160sZmlsZQ%3D%3D?line=7'>8</a>\u001b[0m \u001b[39m'\u001b[39m\u001b[39mdelta_t\u001b[39m\u001b[39m'\u001b[39m: \u001b[39m0.001\u001b[39m, \u001b[39m'\u001b[39m\u001b[39mrandom_state\u001b[39m\u001b[39m'\u001b[39m: \u001b[39mNone\u001b[39;00m, \u001b[39m'\u001b[39m\u001b[39mreturn_option\u001b[39m\u001b[39m'\u001b[39m: \u001b[39m'\u001b[39m\u001b[39mfull\u001b[39m\u001b[39m'\u001b[39m, \u001b[39m'\u001b[39m\u001b[39msmooth\u001b[39m\u001b[39m'\u001b[39m: \u001b[39mFalse\u001b[39;00m}\n\u001b[1;32m      <a href='vscode-notebook-cell:/Users/afengler/Library/CloudStorage/OneDrive-Personal/proj_ssm_simulators/ssm-simulators/notebooks/basic_tutorial.ipynb#Y160sZmlsZQ%3D%3D?line=8'>9</a>\u001b[0m boundary_config \u001b[39m=\u001b[39m ssms\u001b[39m.\u001b[39mconfig\u001b[39m.\u001b[39mboundary_config[\u001b[39m'\u001b[39m\u001b[39mconstant\u001b[39m\u001b[39m'\u001b[39m]\n\u001b[0;32m---> <a href='vscode-notebook-cell:/Users/afengler/Library/CloudStorage/OneDrive-Personal/proj_ssm_simulators/ssm-simulators/notebooks/basic_tutorial.ipynb#Y160sZmlsZQ%3D%3D?line=9'>10</a>\u001b[0m ssms\u001b[39m.\u001b[39;49mconfig\u001b[39m.\u001b[39;49mmodel_config[\u001b[39m\"\u001b[39;49m\u001b[39mlevy\u001b[39;49m\u001b[39m\"\u001b[39;49m][\u001b[39m\"\u001b[39;49m\u001b[39msimulator\u001b[39;49m\u001b[39m\"\u001b[39;49m](\u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mtheta, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mboundary_config, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49msim_stats)\n",
      "File \u001b[0;32msrc/cssm.pyx:1087\u001b[0m, in \u001b[0;36mcssm.levy_flexbound\u001b[0;34m()\u001b[0m\n",
      "\u001b[0;31mTypeError\u001b[0m: 'NoneType' object is not callable"
     ]
    }
   ],
   "source": [
    "theta = {\n",
    "    \"v\": np.array([1.1], dtype=np.float32),\n",
    "    \"a\": np.array([1.65], dtype=np.float32),\n",
    "    \"z\": np.array([0.5], dtype=np.float32),\n",
    "    \"alpha_diff\": np.array([1.5], dtype=np.float32),\n",
    "    \"t\": np.array([0.3], dtype=np.float32),\n",
    "    \"deadline\": np.array([999.0], dtype=np.float32),\n",
    "}\n",
    "sim_stats = {\n",
    "    \"max_t\": 20,\n",
    "    \"s\": 1.0,\n",
    "    \"n_samples\": 100,\n",
    "    \"n_trials\": 1,\n",
    "    \"delta_t\": 0.001,\n",
    "    \"random_state\": None,\n",
    "    \"return_option\": \"full\",\n",
    "    \"smooth\": False,\n",
    "}\n",
    "boundary_config = ssms.config.boundary_config[\"constant\"]\n",
    "ssms.config.model_config[\"levy\"][\"simulator\"](**theta, **boundary_config, **sim_stats)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'fun': <function ssms.basic_simulators.boundary_functions.constant(t=0)>,\n",
       " 'params': [],\n",
       " 'multiplicative': True}"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ssms.config.boundary_config[\"constant\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "ename": "AttributeError",
     "evalue": "module 'ssms' has no attribute 'model_config'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mAttributeError\u001b[0m                            Traceback (most recent call last)",
      "\u001b[1;32m/Users/afengler/Library/CloudStorage/OneDrive-Personal/proj_ssm_simulators/ssm-simulators/notebooks/basic_tutorial.ipynb Cell 13\u001b[0m line \u001b[0;36m1\n\u001b[0;32m----> <a href='vscode-notebook-cell:/Users/afengler/Library/CloudStorage/OneDrive-Personal/proj_ssm_simulators/ssm-simulators/notebooks/basic_tutorial.ipynb#Y162sZmlsZQ%3D%3D?line=0'>1</a>\u001b[0m ssms\u001b[39m.\u001b[39;49mmodel_config\n",
      "\u001b[0;31mAttributeError\u001b[0m: module 'ssms' has no attribute 'model_config'"
     ]
    }
   ],
   "source": [
    "ssms.model_config"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'fun': <function ssms.basic_simulators.boundary_functions.constant(t=0)>,\n",
       " 'params': [],\n",
       " 'multiplicative': True}"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ssms.config.boundary_config[ssms.config.model_config[\"levy\"][\"boundary_name\"]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'rts': array([[1.044994  ],\n",
       "        [0.67699873],\n",
       "        [2.095028  ],\n",
       "        [0.83999664],\n",
       "        [0.966995  ],\n",
       "        [0.7159982 ],\n",
       "        [1.3069911 ],\n",
       "        [2.1710315 ],\n",
       "        [0.5959997 ],\n",
       "        [1.1979921 ],\n",
       "        [0.69099855],\n",
       "        [0.74699783],\n",
       "        [1.6570075 ],\n",
       "        [1.1549926 ],\n",
       "        [0.8589964 ],\n",
       "        [0.7409979 ],\n",
       "        [1.2259917 ],\n",
       "        [0.77999735],\n",
       "        [0.6739987 ],\n",
       "        [0.9769949 ],\n",
       "        [1.4739988 ],\n",
       "        [0.8449966 ],\n",
       "        [1.1489927 ],\n",
       "        [0.9569951 ],\n",
       "        [0.66199887],\n",
       "        [0.812997  ],\n",
       "        [0.6999984 ],\n",
       "        [1.4739988 ],\n",
       "        [1.2239916 ],\n",
       "        [0.6409992 ],\n",
       "        [2.1110287 ],\n",
       "        [0.9109957 ],\n",
       "        [1.5370018 ],\n",
       "        [1.3259919 ],\n",
       "        [1.2389915 ],\n",
       "        [0.9909947 ],\n",
       "        [0.86999625],\n",
       "        [1.5730035 ],\n",
       "        [0.77199745],\n",
       "        [1.371994  ],\n",
       "        [1.0289942 ],\n",
       "        [1.1279929 ],\n",
       "        [1.0909934 ],\n",
       "        [1.6090052 ],\n",
       "        [0.8179969 ],\n",
       "        [1.1439927 ],\n",
       "        [0.6279993 ],\n",
       "        [1.7820132 ],\n",
       "        [0.97099495],\n",
       "        [0.9909947 ],\n",
       "        [1.1029932 ],\n",
       "        [1.2189918 ],\n",
       "        [0.44400012],\n",
       "        [1.2299917 ],\n",
       "        [0.649999  ],\n",
       "        [0.8599964 ],\n",
       "        [1.1459928 ],\n",
       "        [1.4469976 ],\n",
       "        [1.6000047 ],\n",
       "        [0.61299956],\n",
       "        [0.59699976],\n",
       "        [0.65099907],\n",
       "        [0.65599895],\n",
       "        [0.79599714],\n",
       "        [1.4659984 ],\n",
       "        [1.2529913 ],\n",
       "        [1.195992  ],\n",
       "        [0.76899755],\n",
       "        [2.1060283 ],\n",
       "        [0.82199687],\n",
       "        [1.1639924 ],\n",
       "        [1.0249943 ],\n",
       "        [1.0159943 ],\n",
       "        [0.9769949 ],\n",
       "        [1.2569913 ],\n",
       "        [0.6229994 ],\n",
       "        [1.1539927 ],\n",
       "        [0.6249994 ],\n",
       "        [0.77199745],\n",
       "        [0.7039983 ],\n",
       "        [1.7940137 ],\n",
       "        [1.0579939 ],\n",
       "        [0.85399646],\n",
       "        [0.5450003 ],\n",
       "        [0.7599976 ],\n",
       "        [1.048994  ],\n",
       "        [1.3489931 ],\n",
       "        [0.9969946 ],\n",
       "        [0.9959946 ],\n",
       "        [1.1429927 ],\n",
       "        [0.653999  ],\n",
       "        [0.9419953 ],\n",
       "        [0.9039958 ],\n",
       "        [0.59199977],\n",
       "        [1.6590075 ],\n",
       "        [0.7919972 ],\n",
       "        [1.0969933 ],\n",
       "        [1.8550167 ],\n",
       "        [0.729998  ],\n",
       "        [1.3699939 ]], dtype=float32),\n",
       " 'choices': array([[ 1],\n",
       "        [-1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [-1],\n",
       "        [ 1],\n",
       "        [-1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [-1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [-1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [-1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [-1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [-1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [-1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [-1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [-1],\n",
       "        [-1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1],\n",
       "        [ 1]], dtype=int32),\n",
       " 'metadata': {'v': array([1.], dtype=float32),\n",
       "  'a': array([1.65], dtype=float32),\n",
       "  'z': array([0.5], dtype=float32),\n",
       "  't': array([0.3], dtype=float32),\n",
       "  's': 1.0,\n",
       "  'deadline': array([999.], dtype=float32),\n",
       "  'alpha': array([0.6], dtype=float32),\n",
       "  'beta': array([2.], dtype=float32),\n",
       "  'delta_t': 0.0010000000474974513,\n",
       "  'max_t': 20.0,\n",
       "  'n_samples': 100,\n",
       "  'n_trials': 1,\n",
       "  'simulator': 'ddm_flexbound',\n",
       "  'boundary_fun_type': 'weibull_cdf',\n",
       "  'possible_choices': [-1, 1],\n",
       "  'trajectory': array([[ 0.0000000e+00],\n",
       "         [-4.5416024e-02],\n",
       "         [-8.8853694e-02],\n",
       "         ...,\n",
       "         [-9.9900000e+02],\n",
       "         [-9.9900000e+02],\n",
       "         [-9.9900000e+02]], dtype=float32),\n",
       "  'boundary': array([1.65      , 1.6328368 , 1.6240554 , ..., 0.03080562, 0.03080195,\n",
       "         0.03079827], dtype=float32),\n",
       "  'model': 'weibull'},\n",
       " 'choice_p': array([[0.12, 0.88]]),\n",
       " 'choice_p_no_omission': array([[0.12, 0.88]]),\n",
       " 'omission_p': array([[0.]]),\n",
       " 'nogo_p': array([[0.12]]),\n",
       " 'go_p': array([[0.88]]),\n",
       " 'binned_128': array([[[ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  1.],\n",
       "         [ 0.,  8.],\n",
       "         [ 1., 19.],\n",
       "         [ 3., 11.],\n",
       "         [ 1., 16.],\n",
       "         [ 3., 15.],\n",
       "         [ 1.,  4.],\n",
       "         [ 0.,  6.],\n",
       "         [ 1.,  3.],\n",
       "         [ 0.,  3.],\n",
       "         [ 0.,  0.],\n",
       "         [ 2.,  2.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.]]]),\n",
       " 'binned_256': array([[[ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  1.],\n",
       "         [ 0.,  1.],\n",
       "         [ 0.,  6.],\n",
       "         [ 1., 11.],\n",
       "         [ 0.,  9.],\n",
       "         [ 3.,  7.],\n",
       "         [ 0.,  3.],\n",
       "         [ 1., 10.],\n",
       "         [ 0.,  7.],\n",
       "         [ 0.,  9.],\n",
       "         [ 3.,  5.],\n",
       "         [ 0.,  3.],\n",
       "         [ 1.,  2.],\n",
       "         [ 0.,  4.],\n",
       "         [ 0.,  1.],\n",
       "         [ 1.,  2.],\n",
       "         [ 0.,  2.],\n",
       "         [ 0.,  2.],\n",
       "         [ 0.,  1.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 1.,  2.],\n",
       "         [ 1.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.],\n",
       "         [ 0.,  0.]]])}"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sim_out"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1, 1)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sim_out[\"omission_p\"].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'Density')"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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TWFhYerXr5/uuOOORn9mhw4d0t/+9jdNnDixXntQUJCeffZZTZ48WRaLReecc47efPPNen0+/fRT/eIXv1CPHj0UFRWlG2+8UW632zv9m2++0Q033KDu3bsrJiZGixYt0iWXXKI777yz0XpOrjs6OloxMTEaM2aMZsyYoc2bN6uqqqreNu3Ro4e6dOnifb9r1y6NGzdO3bt3V69evTR27Fjt27ev0fXcc889Ovfcc2WxWDRo0CA9+OCDOn78uHf6yf3m2Wef1cCBAxUeHi5JOnLkiG666Sb17dtXkZGRuvTSS/XJJ580+Zn279+v6667Tr169VKfPn00adIk7d271zt9+vTpSk1N1aOPPqp+/frpvPPO8+6Hq1ev1rhx4xQeHq4XX3yxxfvvj+fbt2+fJk6cqN69e6t79+664IIL9Ne//tU73+WXX67Dhw/rvffea/KzAIQbdFqffvqpNm3aVO+vz5ycHD3//PNasmSJdu7cqbvuuktpaWneX6Z1dXU6++yz9fLLL+uzzz5Tdna27rvvPv35z3/2LuPpp5/WrFmzdPPNN2vHjh168803NWTIEEnSRx99JElavny5vvrqK+/7H3viiSe0cOFCLViwQNu3b1dKSoquuuoqff755/X63X///ZozZ462bdumc889V9dff703RPjKI488omnTpmnbtm06//zz9etf/1q33HKLsrKytGXLFhmG4Q1vkvTBBx9o2rRpmj17tj777DMtXbpUK1as0KOPPipJevXVV7Vo0SItXbpUn3/+uV5//XVdeOGFja7/73//uzdY/di8efN03XXXafv27bryyit1ww036PDhw5JOfMFfeumlGj58uLZs2aK1a9eqrKxM1113nXd+h8OhjRs36s0339SGDRv0wQcfqLi4uFXbp7y8XGvWrFFISIhCQkIa7ffdd98pNTVV48aN0/bt21VUVKSbb75ZQUFBjc4TERGhFStW6LPPPtMTTzyhZ555RosWLarXZ/fu3Xr11Vf12muvadu2bZKka6+9VuXl5Xr77be1detWJSYm6rLLLvNumx87fvy4UlJSFBERoQ8++EAbN25Ujx49NGHCBNXU1Hj7FRQUqKSkRBs2bNBf/vIXb/u9996r2bNny+l0KiUlpcX774/nmzVrlqqrq/X+++9rx44dmj9/fr0jmqGhoUpISNAHH3zQ6DYDJEl+fSY50I7S09ONkJAQo3v37kZYWJghyQgODjZeeeUVwzAM49ixY4bFYjE2bdpUb74ZM2YY119/faPLnTVrlnH11Vd73/fr18+4//77G+0vyVizZk29trlz5xrx8fH1lvHoo4/W63PRRRcZt99+u2EYhvHFF18Ykoxnn33WO33nzp2GJMPpdDa67pPS09ONSZMmndI+YMAAY9GiRfVqfeCBB7zvi4qKDEnGc88952176aWXjPDwcO/7yy67zPj9739fb7kvvPCCERMTYxiGYSxcuNA499xzjZqammbrNAzDWLRokTFo0KBT2n9cW2VlpSHJePvttw3DMIxHHnnEuOKKK+rNs3//fkOSUVJSYlRUVBhdu3Y1Xn75Ze/0I0eOGBaLxZg9e3aj9SxfvtyQZHTv3t2wWCyGJEOScccdd5zS94c/13//+9+GJKOwsLBFn7shjz/+uDFixIh6y+/atatRXl7ubfvggw+MyMhI49ixY/XmHTx4sLF06dIGl/vCCy8Y5513nlFXV+dtq66uNrp162asW7fOMIwT+0xUVJRRXV3t7XNyP8zLy6u3vJbuvz+e78ILLzQeeuihJrfB5MmTjenTpzfZB+CkJTqV8ePH6+mnn1ZVVZUWLVqkLl266Oqrr5Z04i9gj8ejyy+/vN48NTU1Gj58uPf94sWLtWzZMrlcLn377beqqanxnlIqLy/XwYMHddlll7W5xoqKCh08eFBjx46t1z527NhTTi0MGzbM+++YmBhvDeeff36b1/9jP1xHVFSUJNU70hIVFaVjx46poqJCkZGR+uSTT7Rx40bvkRrpxOm8Y8eOyePx6Nprr1VeXp4GDRqkCRMm6Morr9TEiRMbHUPx7bffek+3NFVb9+7dFRkZqfLycknSJ598onfffbfBsUx79uzRt99+q+PHjyspKcnb3rNnT5133nnNbpOIiAgVFxfr+PHjevvtt/Xiiy/W+7wN6dOnj6ZPn66UlBRdfvnlSk5O1nXXXef9uTVk9erVevLJJ7Vnzx5VVlbqu+++U2RkZL0+AwYMUN++fb3vP/nkE1VWVuonP/lJvX7ffvvtKacPfzjP7t27FRERUa/92LFj9ea58MILGxxnM3LkSO+/W7P//nA+Sbrjjjt02223af369UpOTtbVV19d72csSd26dZPH42nwcwAnEW7QqXTv3t17imjZsmWKj4/Xc889pxkzZqiyslKS9NZbb6l///715gsLC5MkrVq1SnPmzNHChQs1evRoRURE6PHHH9eHH34o6cQv3vb0wwGYJ09v1NXVnfF1NLXeyspKzZs3T1OmTDllWeHh4YqNjVVJSYneeecdbdiwQbfffrsef/xxvffeew0OKLVarfr666+bre1kLT+sY+LEiQ0OFo+JidHu3bub/NxNCQ4O9u5Hdrtde/bs0W233aYXXnihyfmWL1+uO+64Q2vXrtXq1av1wAMPaMOGDbr44otP6VtUVKQbbrhB8+bNU0pKinr27KlVq1Zp4cKF9fp179693vvKykrFxMSosLDwlGX26tWrwboqKys1YsQIvfjii6dM+2Fw+vG6mmtvzo/nu+mmm5SSkqK33npL69evV05OjhYuXKjf/va33j6HDx/W4MGD27Q+dB6EG3RawcHBuu++++RwOPTrX/9aQ4cOVVhYmFwul8aNG9fgPBs3btSYMWN0++23e9t++JdtRESE4uLiVFBQoPHjxze4jK5du6q2trbRuiIjI9WvXz9t3LixXh0bN26sd5QhUCUmJqqkpMT75d+Qbt26aeLEiZo4caJmzZql888/Xzt27FBiYuIpfYcPH67S0lJ9/fXX6t27d6vqePXVVxUXF9fgUaFBgwapa9eu+uijj2Sz2SRJR48e1T//+U/9/Oc/b/F6pBNjRwYPHqy77rqrwc/w488zfPhwZWVlafTo0Vq5cmWD4WbTpk0aMGCA7r//fm9bU4OPT0pMTFRpaam6dOniHbDeknlWr16ts84665QjQ611uvtvbGysbr31Vt16663KysrSM888Uy/cfPrpp7rmmmtOq0aYHwOK0alde+21CgkJ0eLFixUREaE5c+borrvu0p/+9Cft2bNHxcXFeuqpp/SnP/1JknTOOedoy5YtWrdunf75z3/qwQcfPGVQ8EMPPaSFCxfqySef1Oeff+5dxkknw8/JL+yG3H333Zo/f75Wr16tkpIS3Xvvvdq2bZtmz5595jaGj2RnZ+v555/XvHnztHPnTjmdTq1atUoPPPCApBP3iXnuuef06aef6l//+pfy8/PVrVs3DRgwoMHlDR8+XFarVRs3bmxVHbNmzdLhw4d1/fXX66OPPtKePXu0bt06ZWRkqLa2VhEREUpPT9fdd9+td999Vzt37tSMGTMUHBzc5CDfhsTGxmry5MnKzs5utM8XX3yhrKwsFRUVad++fVq/fr0+//zzBgdKSyf2NZfLpVWrVmnPnj168skntWbNmmZrSU5O1ujRo5Wamqr169dr79692rRpk+6//35t2bKlwXluuOEGWa1WTZo0SR988IG++OILFRYW6o477tCXX37Zso3wA23df++8806tW7dOX3zxhYqLi/Xuu+/W2z579+7VgQMHlJyc3Oqa0LkQbtCpdenSRZmZmfrDH/6gqqoqPfLII3rwwQeVk5Mju92uCRMm6K233tLAgQMlSbfccoumTJmiqVOnatSoUfr3v/9d7yiOJKWnpysvL09//OMfdcEFF+iXv/xlvatEFi5cqA0bNig2NrbeWJ4fuuOOO+RwOPRf//VfuvDCC7V27Vq9+eabOuecc87cxvCRlJQU/eUvf9H69et10UUX6eKLL9aiRYu84aVXr1565plnNHbsWA0bNkzvvPOO/u///u+UMSInhYSEKCMjo8FTJk05efSgtrZWV1xxhS688ELdeeed6tWrl/d+Obm5uRo9erR++ctfKjk5WWPHjpXdbm90jE9T7rrrLr311lvavHlzg9MtFot27dqlq6++Wueee65uvvlmzZo1S7fcckuD/a+66irdddddyszMVEJCgjZt2qQHH3yw2TqCgoL017/+VT//+c+VkZGhc889V7/61a+0b98+75iphmp7//33ZbPZNGXKFNntds2YMUPHjh1r05Gctu6/tbW1mjVrlvf/vXPPPVd//OMfvdNfeuklXXHFFY0GYeCkIMMwDH8XAQBNKS0t1QUXXKDi4uIz+sVWVVWl/v37a+HChZoxY8YZWw9ar6amRuecc45Wrlx5ymBl4Mc4cgMg4EVHR+u5556Ty+Xy6XI//vhjvfTSS95TkDfccIMkadKkST5dD06fy+XSfffdR7BBi3DkBkCn9fHHH+umm25SSUmJQkNDNWLECOXm5jZ5U0EAgY9wAwAATIXTUgAAwFQINwAAwFQINwAAwFQINwAAwFQINwAAwFQINwAAwFQINwAAwFQINwAAwFT+Hz+6gKba1GPDAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.hist(\n",
    "    sim_out[\"rts\"][sim_out[\"rts\"] != -999] * sim_out[\"choices\"][sim_out[\"rts\"] != -999],\n",
    "    bins=50,\n",
    "    histtype=\"step\",\n",
    "    color=\"black\",\n",
    "    label=\"Weibull Deadline\",\n",
    "    density=True,\n",
    ")\n",
    "plt.xlabel(\"Reaction Times (neg RTs are errors)\")\n",
    "plt.ylabel(\"Density\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The output of the simulator is a `dictionary` with three elements.\n",
    "\n",
    "1. `rts` (array)\n",
    "2. `choices` (array)\n",
    "3. `metadata` (dictionary)\n",
    "\n",
    "The `metadata` includes the named parameters, simulator settings, and more."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Deadlines\n",
    "\n",
    "You can actually attach a deadline to the simulator of every model, by simply attaching `_deadline` to the `model` argument in the `simulator()` function and passing an extra `deadline` parameter through the `theta` dictionary. Below an example."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1.]\n"
     ]
    }
   ],
   "source": [
    "sim_out_deadline = simulator(\n",
    "    model=\"weibull_deadline\",\n",
    "    theta={\n",
    "        \"v\": 0.0,\n",
    "        \"a\": 1.65,\n",
    "        \"z\": 0.5,\n",
    "        \"t\": 0.3,\n",
    "        \"alpha\": 0.6,\n",
    "        \"beta\": 2.0,\n",
    "        \"deadline\": 1.0,\n",
    "    },\n",
    "    n_samples=10000,\n",
    "    smooth_unif=False,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Samples that breached the deadline will have an `rt` of `-999`. We can plot the resulting reaction times below."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'Density')"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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atKkSUXXApSKw+GQy+WSx+Mpso/L5VJCQoI8Hg/hBgBqmXKFmylTpmjixIl66623ZLPZKromoEQOh4PQAgAoVLnCzbRp07Rnzx6Fh4erVatWqlu3rs/yjRs3VkhxAACUltvtLvGILmqHcoWbfv36VXAZAACUn9vtltPpVG5ubrH9bDab7HZ7FVUFfylXuJk0aVJF1wEAQLl5PB7l5uZq4cKFcjqdRfbjKsraodxf4vfrr7/qgw8+0J49e/T444+rSZMm2rhxo8LDw9WiRYuKrBEAgFJxOp2Kjo72dxnws3KFm2+//VZxcXFq1KiR9u3bp2HDhqlJkyZaunSp3G633n777YquEwAAoFTK9cOZSUlJGjx4sHbt2qXQ0FBv+6233qo1a9ZUWHEAAABlVa5w88033+jhhx8u0N6iRQtlZGRccFEAAADlVa5wExISoqysrALt33//vZo2bXrBRQEAAJRXucLNHXfcoWeffVanT5+WJAUEBMjtduuJJ57QXXfdVaEFAgAAlEW5ws20adOUnZ2tpk2b6vjx4+rZs6cuueQSNWzYUM8991yZtjVr1iy1atVKoaGhiomJ0ddff11s/19//VUjR45UZGSkQkJC1L59ey1fvrw8wwAAABZUrqulGjVqpNWrV2vt2rXasmWLsrOzFR0drbi4uDJtZ8mSJUpKStLs2bMVExOjmTNnKj4+Xjt37lSzZs0K9D916pRuvvlmNWvWTB988IFatGih/fv3q3HjxuUZBgAAsKAyh5v8/HwtWLBAS5cu1b59+xQQEKDWrVsrIiJCxhgFBASUelvTp0/XsGHDNGTIEEnS7NmztWzZMs2bN0/jx48v0H/evHk6cuSI1q1b5/3Jh1atWhX7GCdPntTJkye99wubKwQAAKyjTKeljDG644479NBDD+nHH39Ux44ddfnll2v//v0aPHiw7rzzzlJv69SpU9qwYYPP0Z7AwEDFxcUpPT290HU++eQTxcbGauTIkQoPD9cVV1yh559/Xnl5eUU+TkpKiho1auS9RUVFlX7AAACgxinTkZsFCxZozZo1Sk1N1Q033OCz7J///Kf69eunt99+W4MGDSpxWx6PR3l5eQoPD/dpDw8P144dOwpd54cfftA///lP3X///Vq+fLl2796tESNG6PTp00X+JERycrKSkpK897Oysgg4AABYWJmO3Lz77rt68sknCwQbSbrxxhs1fvx4vfPOOxVW3Pny8/PVrFkz/eUvf1G3bt00YMAAPfXUU5o9e3aR64SEhCgsLMznBgAArKtM4ebbb79V7969i1x+yy23aMuWLaXalt1uV1BQkDIzM33aMzMzFRERUeg6kZGRat++vYKCgrxtTqdTGRkZOnXqVKkeFwAAWFuZws2RI0cKnEY6V3h4uH755ZdSbSs4OFjdunVTamqqty0/P1+pqamKjY0tdJ2rr75au3fvVn5+vrft+++/V2RkpIKDg0s5CgAAYGVlCjd5eXmqU6foaTpBQUE6c+ZMqbeXlJSkOXPm6K233pLL5dKjjz6qnJwc79VTgwYNUnJysrf/o48+qiNHjmjMmDH6/vvvtWzZMj3//PMaOXJkWYYBAAAsrEwTio0xGjx4sEJCQgpdfu4l16UxYMAAHT58WBMnTlRGRoa6dOmiFStWeI8Oud1uBQb+N39FRUVp5cqVGjt2rDp16qQWLVpozJgxeuKJJ8r0uAAAwLrKFG4SExNL7FOaK6XONWrUKI0aNarQZWlpaQXaYmNj9e9//7tMjwEAAGqPMoWb+fPnV1YdAAAAFaJcvy0FAABQXRFuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApZTp5xeAmsblchW73G63y+FwVFE1AICqQLiBJdntdtlsNiUkJBTbz2azyeVyEXAAwEIIN7Akh8Mhl8slj8dTZB+Xy6WEhAR5PB7CDQBYCOEGluVwOAgtAFALMaEYAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYCuEGAABYSh1/FwAAQEncbrc8Hk+Ry10uVxVWg+qOcAMAqNbcbrecTqdyc3OL7Wez2WS326uoKlRnhBsAQLXm8XiUm5urhQsXyul0FtnPbrfL4XBUYWWorgg3AIAawel0Kjo62t9loAZgQjEAALAUwg0AALCUahFuZs2apVatWik0NFQxMTH6+uuvS7Xe4sWLFRAQoH79+lVugQAAoMbwe7hZsmSJkpKSNGnSJG3cuFGdO3dWfHy8Dh06VOx6+/bt07hx43TttddWUaUAAKAm8Hu4mT59uoYNG6YhQ4bosssu0+zZs2Wz2TRv3rwi18nLy9P999+vyZMnq02bNsVu/+TJk8rKyvK5AQAA6/JruDl16pQ2bNiguLg4b1tgYKDi4uKUnp5e5HrPPvusmjVrpqFDh5b4GCkpKWrUqJH3FhUVVSG1AwCA6smv4cbj8SgvL0/h4eE+7eHh4crIyCh0nS+//FJz587VnDlzSvUYycnJOnr0qPd24MCBC64bAABUXzXqe26OHTumBx54QHPmzCn1t1CGhIQoJCSkkisDAADVhV/Djd1uV1BQkDIzM33aMzMzFRERUaD/nj17tG/fPvXp08fblp+fL0mqU6eOdu7cqbZt21Zu0QAAoFrz62mp4OBgdevWTampqd62/Px8paamKjY2tkD/Sy+9VFu3btXmzZu9tzvuuEM33HCDNm/ezHwaAADg/9NSSUlJSkxM1JVXXqnu3btr5syZysnJ0ZAhQyRJgwYNUosWLZSSkqLQ0FBdccUVPus3btxYkgq0AwCA2snv4WbAgAE6fPiwJk6cqIyMDHXp0kUrVqzwTjJ2u90KDPT7FesAAKCG8Hu4kaRRo0Zp1KhRhS5LS0srdt0FCxZUfEEAAKDG4pAIAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwFMINAACwlDr+LgDwN5fLVexyu90uh8NRRdUAAC4U4Qa1lt1ul81mU0JCQrH9bDabXC4XAQcAagjCDWoth8Mhl8slj8dTZB+Xy6WEhAR5PB7CDQDUEIQb1GoOh4PQAgAWw4RiAABgKRy5AQD4jdvtLvbUsFTypH/gfIQbAIBfuN1uOZ1O5ebmltjXZrPJbrdXQVWwAsINAMAvPB6PcnNztXDhQjmdzmL78pUMKAvCDQDAr5xOp6Kjo/1dBiyECcUAAMBSqkW4mTVrllq1aqXQ0FDFxMTo66+/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nKw6dfj4QtGqx18KoIqEhIQoIiJCUVFR6tevn+Li4rR69Wrv8vz8fKWkpKh169aqV6+eOnfurA8++MC7PC8vT0OHDvUu79Chg15++eUCjzNv3jxdfvnlCgkJUWRkpEaNGiXpt9M+knTnnXcqICDAe//801L5+fl69tlndfHFFyskJERdunTRihUrvMvPHiFYunSpbrjhBtlsNnXu3Fnp6emFjjs4OFgRERHeW7169bzPxdlbcHBwgdNSAQEBeuONN3T77bfLZrPJ6XQqPT1du3fv1vXXX6/69eurR48e2rNnj8/jffzxx4qOjlZoaKjatGmjyZMn68yZM5IkY4yeeeYZORwOhYSEqHnz5ho9enSR++zw4cP65z//qT59+vi0BwQE6M0339Sdd94pm82mdu3a6ZNPPvHp89133+mWW25RgwYNFB4ergceeEAej8e7/NixY7r//vtVv359RUZGasaMGbr++uv12GOPFVnP2ceOiIhQZGSkevTooaFDh+rrr79WTk6Oz3PaoEED1alTx3t/x44d6tmzp+rXr6/GjRvr6quv1v79+4t8nCeeeELt27eXzWZTmzZtNGHCBJ0+fdq7/Ozr5s0331Tr1q0VGhoqSfr111/10EMPqWnTpgoLC9ONN96oLVu2FDumAwcO6J577lHjxo3VpEkT9e3bV/v27fMuHzx4sPr166fnnntOzZs3V4cOHbyvwyVLlqhnz54KDQ3VO++8U+rX7/nr7d+/X3369NFFF12k+vXr6/LLL9fy5cu969188806cuSI/vWvfxU7FoBwg1rru+++07p163z+9ZmSkqK3335bs2fP1rZt2zR27FglJCR4/5jm5+fr4osv1vvvv6/t27dr4sSJevLJJ/Xee+95t/H6669r5MiRGj58uLZu3apPPvlEl1xyiSTpm2++kSTNnz9fBw8e9N4/38svv6xp06bppZde0rfffqv4+Hjdcccd2rVrl0+/p556SuPGjdPmzZvVvn17DRw40BsiKsqUKVM0aNAgbd68WZdeeqnuu+8+Pfzww0pOTtb69etljPGGN0n64osvNGjQII0ZM0bbt2/XG2+8oQULFui5556TJP3tb3/TjBkz9MYbb2jXrl366KOP1LFjxyIf/8svv/QGq/NNnjxZ99xzj7799lvdeuutuv/++3XkyBFJv33A33jjjeratavWr1+vFStWKDMzU/fcc493/aSkJK1du1affPKJVq9erS+++EIbN24s0/Nz6NAhffjhhwoKClJQUFCR/c6cOaN+/fqpZ8+e+vbbb5Wenq7hw4crICCgyHUaNmyoBQsWaPv27Xr55Zc1Z84czZgxw6fP7t279be//U1Lly7V5s2bJUl33323Dh06pE8//VQbNmxQdHS0brrpJu9zc77Tp08rPj5eDRs21BdffKG1a9eqQYMG6t27t06dOuXtl5qaqp07d2r16tX6xz/+4W0fP368xowZI5fLpfj4+FK/fs9fb+TIkTp58qTWrFmjrVu36oUXXvA5ohkcHKwuXbroiy++KPI5AyRJFfob40A1lpiYaIKCgkz9+vVNSEiIkWQCAwPNBx98YIwx5sSJE8Zms5l169b5rDd06FAzcODAIrc7cuRIc9ddd3nvN2/e3Dz11FNF9pdkPvzwQ5+2SZMmmc6dO/ts47nnnvPp8/vf/96MGDHCGGPM3r17jSTz5ptvepdv27bNSDIul6vIxz4rMTHR9O3bt0B7y5YtzYwZM3xqffrpp73309PTjSQzd+5cb9u7775rQkNDvfdvuukm8/zzz/ts969//auJjIw0xhgzbdo00759e3Pq1KkS6zTGmBkzZpg2bdoUaD+/tuzsbCPJfPrpp8YYY6ZMmWJ69erls86BAweMJLNz506TlZVl6tata95//33v8l9//dXYbDYzZsyYIuuZP3++kWTq169vbDabkWQkmdGjRxfoe+5+/fnnn40kk5aWVqpxF+bFF1803bp189l+3bp1zaFDh7xtX3zxhQkLCzMnTpzwWbdt27bmjTfeKHS7f/3rX02HDh1Mfn6+t+3kyZOmXr16ZuXKlcaY314z4eHh5uTJk94+Z1+HM2fO9NleaV+/56/XsWNH88wzzxT7HNx5551m8ODBxfYBOGmJWuWGG27Q66+/rpycHM2YMUN16tTRXXfdJem3fwHn5ubq5ptv9lnn1KlT6tq1q/f+rFmzNG/ePLndbh0/flynTp3ynlI6dOiQfvrpJ910003lrjErK0s//fSTrr76ap/2q6++usCphU6dOnn/PzIy0lvDpZdeWu7HP9+5jxEeHi5JPkdawsPDdeLECWVlZSksLExbtmzR2rVrvUdqpN9O5504cUK5ubm6++67NXPmTLVp00a9e/fWrbfeqj59+hQ5h+L48ePe0y3F1Va/fn2FhYXp0KFDkqQtW7bo888/L3Qu0549e3T8+HGdPn1a3bt397Y3atRIHTp0KPE5adiwoTZu3KjTp0/r008/1TvvvOMz3sI0adJEgwcPVnx8vG6++WbFxcXpnnvu8e63wixZskSvvPKK9uzZo+zsbJ05c0ZhYWE+fVq2bKmmTZt672/ZskXZ2dn63e9+59Pv+PHjBU4fnrvO7t271bBhQ5/2EydO+KzTsWPHQufZXHnlld7/L8vr99z1JGn06NF69NFHtWrVKsXFxemuu+7y2ceSVK9ePeXm5hY6DuAswg1qlfr163tPEc2bN0+dO3fW3LlzNXToUGVnZ0uSli1bphYtWvisFxISIklavHixxo0bp2nTpik2NlYNGzbUiy++qK+++krSb394q9K5EzDPnt7Iz8+v9Mco7nGzs7M1efJk9e/fv8C2QkNDFRUVpZ07d+qzzz7T6tWrNWLECL344ov617/+VeiEUrvdrl9++aXE2s7Wcm4dffr0KXSyeGRkpHbv3l3suIsTGBjofR05nU7t2bNHjz76qP76178Wu978+fM1evRorVixQkuWLNHTTz+t1atX66qrrirQNz09Xffff78mT56s+Ph4NWrUSIsXL9a0adN8+tWvX9/nfnZ2tiIjI5WWllZgm40bNy60ruzsbHXr1k3vvPNOgWXnBqfzH6uk9pKcv95DDz2k+Ph4LVu2TKtWrVJKSoqmTZum//mf//H2OXLkiNq2bVuux0PtQbhBrRUYGKgnn3xSSUlJuu+++3TZZZcpJCREbrdbPXv2LHSdtWvXqkePHhoxYoS37dx/2TZs2FCtWrVSamqqbrjhhkK3UbduXeXl5RVZV1hYmJo3b661a9f61LF27VqfowzVVXR0tHbu3On98C9MvXr11KdPH/Xp00cjR47UpZdeqq1btyo6OrpA365duyojI0O//PKLLrroojLV8be//U2tWrUq9KhQmzZtVLduXX3zzTdyOBySpKNHj+r777/XddddV+rHkX6bO9K2bVuNHTu20DGcP56uXbsqOTlZsbGxWrRoUaHhZt26dWrZsqWeeuopb1txk4/Pio6OVkZGhurUqeOdsF6adZYsWaJmzZoVODJUVhf6+o2KitIjjzyiRx55RMnJyZozZ45PuPnuu+/0hz/84YJqhPUxoRi12t13362goCDNmjVLDRs21Lhx4zR27Fi99dZb2rNnjzZu3KhXX31Vb731liSpXbt2Wr9+vVauXKnvv/9eEyZMKDAp+JlnntG0adP0yiuvaNeuXd5tnHU2/Jz9wC7M448/rhdeeEFLlizRzp07NX78eG3evFljxoypvCejgkycOFFvv/22Jk+erG3btsnlcmnx4sV6+umnJf32PTFz587Vd999px9++EELFy5UvXr11LJly0K317VrV9ntdq1du7ZMdYwcOVJHjhzRwIED9c0332jPnj1auXKlhgwZory8PDVs2FCJiYl6/PHH9fnnn2vbtm0aOnSoAgMDi53kW5ioqCjdeeedmjhxYpF99u7dq+TkZKWnp2v//v1atWqVdu3aVehEaem315rb7dbixYu1Z88evfLKK/rwww9LrCUuLk6xsbHq16+fVq1apX379mndunV66qmntH79+kLXuf/++2W329W3b1998cUX2rt3r9LS0jR69Gj95z//Kd2TcI7yvn4fe+wxrVy5Unv37tXGjRv1+eef+zw/+/bt048//qi4uLgy14TahXCDWq1OnToaNWqU/vznPysnJ0dTpkzRhAkTlJKSIqfTqd69e2vZsmVq3bq1JOnhhx9W//79NWDAAMXExOjnn3/2OYojSYmJiZo5c6Zee+01XX755br99tt9rhKZNm2aVq9eraioKJ+5POcaPXq0kpKS9Mc//lEdO3bUihUr9Mknn6hdu3aV92RUkPj4eP3jH//QqlWr9Pvf/15XXXWVZsyY4Q0vjRs31pw5c3T11VerU6dO+uyzz/T3v/+9wByRs4KCgjRkyJBCT5kU5+zRg7y8PPXq1UsdO3bUY489psaNG3u/L2f69OmKjY3V7bffrri4OF199dVyOp1FzvEpztixY7Vs2TJ9/fXXhS632WzasWOH7rrrLrVv317Dhw/XyJEj9fDDDxfa/4477tDYsWM1atQodenSRevWrdOECRNKrCMgIEDLly/XddddpyFDhqh9+/a69957tX//fu+cqcJqW7NmjRwOh/r37y+n06mhQ4fqxIkT5TqSU97Xb15enkaOHOl977Vv316vvfaad/m7776rXr16FRmEgbMCjDHG30UAQHEyMjJ0+eWXa+PGjZX6wZaTk6MWLVpo2rRpGjp0aKU9Dsru1KlTateunRYtWlRgsjJwPo7cAKj2IiIiNHfuXLnd7grd7qZNm/Tuu+96T0Hef//9kqS+fftW6OPgwrndbj355JMEG5QKR24A1FqbNm3SQw89pJ07dyo4OFjdunXT9OnTi/1SQQDVH+EGAABYCqelAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApRBuAACApfx/hZXBbKi3WhYAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "\n",
    "plt.hist(\n",
    "    sim_out_deadline[\"rts\"][sim_out_deadline[\"rts\"] != -999]\n",
    "    * sim_out_deadline[\"choices\"][sim_out_deadline[\"rts\"] != -999],\n",
    "    bins=50,\n",
    "    histtype=\"step\",\n",
    "    color=\"black\",\n",
    "    label=\"Weibull Deadline\",\n",
    "    density=True,\n",
    ")\n",
    "plt.xlabel(\"Reaction Times (neg RTs are errors)\")\n",
    "plt.ylabel(\"Density\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Using the Training Data Generators\n",
    "\n",
    "The training data generators sit on top of the simulator function to turn raw simulations into usable training data for training machine learning algorithms aimed at posterior or likelihood armortization.\n",
    "\n",
    "We will use the `data_generator` class from `ssms.dataset_generators`. Initializing the `data_generator` boils down to supplying two configuration dictionaries.\n",
    "\n",
    "1. The `generator_config`, concerns choices as to what kind of training data one wants to generate.\n",
    "2. The `model_config` concerns choices with respect to the underlying generative *sequential sampling model*. \n",
    "\n",
    "We will consider a basic example here, concerning data generation to prepare for training [LANs](https://elifesciences.org/articles/65074).\n",
    "\n",
    "Let's start by peeking at an example `generator_config`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'output_folder': 'data/lan_mlp/',\n",
       " 'model': 'ddm',\n",
       " 'nbins': 0,\n",
       " 'n_samples': 100000,\n",
       " 'n_parameter_sets': 10000,\n",
       " 'n_parameter_sets_rejected': 100,\n",
       " 'n_training_samples_by_parameter_set': 1000,\n",
       " 'max_t': 20.0,\n",
       " 'delta_t': 0.001,\n",
       " 'pickleprotocol': 4,\n",
       " 'n_cpus': 'all',\n",
       " 'kde_data_mixture_probabilities': [0.8, 0.1, 0.1],\n",
       " 'simulation_filters': {'mode': 20,\n",
       "  'choice_cnt': 0,\n",
       "  'mean_rt': 17,\n",
       "  'std': 0,\n",
       "  'mode_cnt_rel': 0.95},\n",
       " 'negative_rt_cutoff': -66.77497,\n",
       " 'n_subruns': 10,\n",
       " 'bin_pointwise': False,\n",
       " 'separate_response_channels': False,\n",
       " 'smooth_unif': True}"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ssms.config.data_generator_config[\"lan\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You usually have to make just few changes to this basic configuration dictionary.\n",
    "An example below."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "from copy import deepcopy\n",
    "\n",
    "# Initialize the generator config (for MLP LANs)\n",
    "generator_config = deepcopy(ssms.config.data_generator_config[\"lan\"])\n",
    "# Specify generative model (one from the list of included models mentioned above)\n",
    "generator_config[\"model\"] = \"ddm_deadline\"\n",
    "# Specify number of parameter sets to simulate\n",
    "generator_config[\"n_parameter_sets\"] = 1000\n",
    "# Specify how many samples a simulation run should entail\n",
    "generator_config[\"n_samples\"] = 2000\n",
    "generator_config[\"n_cpus\"] = \"all\"\n",
    "generator_config[\"smooth_unif\"] = True"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's define our corresponding `model_config`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'name': 'ddm', 'params': ['v', 'a', 'z', 't'], 'param_bounds': [[-3.0, 0.3, 0.1, 0.0], [3.0, 2.5, 0.9, 2.0]], 'boundary_name': 'constant', 'boundary': <function constant at 0x126b116c0>, 'boundary_params': [], 'n_params': 4, 'default_params': [0.0, 1.0, 0.5, 0.001], 'nchoices': 2, 'simulator': <cyfunction ddm_flexbound at 0x17b0ade50>}\n"
     ]
    }
   ],
   "source": [
    "model_config = ssms.config.model_config[\"ddm\"]\n",
    "print(model_config)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We are now ready to initialize a `data_generator`, after which we can generate training data using the `generate_data_training_uniform` function, which will use the hypercube defined by our parameter bounds from the `model_config` to uniformly generate parameter sets and corresponding simulated datasets."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'name': 'ddm_deadline', 'params': ['v', 'a', 'z', 't', 'deadline'], 'param_bounds': [[-3.0, 0.3, 0.1, 0.0, 0.001], [3.0, 2.5, 0.9, 2.0, 10]], 'boundary_name': 'constant', 'boundary': <function constant at 0x126b116c0>, 'boundary_params': [], 'n_params': 5, 'default_params': [0.0, 1.0, 0.5, 0.001, 10], 'nchoices': 2, 'simulator': <cyfunction ddm_flexbound at 0x17b0ade50>}\n",
      "n_cpus used:  12\n",
      "checking:  data/lan_mlp/\n"
     ]
    }
   ],
   "source": [
    "my_dataset_generator = ssms.dataset_generators.lan_mlp.data_generator(\n",
    "    generator_config=generator_config, model_config=model_config\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'name': 'ddm_deadline',\n",
       " 'params': ['v', 'a', 'z', 't', 'deadline'],\n",
       " 'param_bounds': [[-3.0, 0.3, 0.1, 0.0, 0.001], [3.0, 2.5, 0.9, 2.0, 10]],\n",
       " 'boundary_name': 'constant',\n",
       " 'boundary': <function ssms.basic_simulators.boundary_functions.constant(t=0)>,\n",
       " 'boundary_params': [],\n",
       " 'n_params': 5,\n",
       " 'default_params': [0.0, 1.0, 0.5, 0.001, 10],\n",
       " 'nchoices': 2,\n",
       " 'simulator': <cyfunction ddm_flexbound at 0x17b0ade50>}"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "my_dataset_generator.model_config"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'output_folder': 'data/lan_mlp/',\n",
       " 'model': 'ddm_deadline',\n",
       " 'nbins': 0,\n",
       " 'n_samples': 2000,\n",
       " 'n_parameter_sets': 1000,\n",
       " 'n_parameter_sets_rejected': 100,\n",
       " 'n_training_samples_by_parameter_set': 1000,\n",
       " 'max_t': 20.0,\n",
       " 'delta_t': 0.001,\n",
       " 'pickleprotocol': 4,\n",
       " 'n_cpus': 12,\n",
       " 'kde_data_mixture_probabilities': [0.8, 0.1, 0.1],\n",
       " 'simulation_filters': {'mode': 20,\n",
       "  'choice_cnt': 0,\n",
       "  'mean_rt': 17,\n",
       "  'std': 0,\n",
       "  'mode_cnt_rel': 0.95},\n",
       " 'negative_rt_cutoff': -66.77497,\n",
       " 'n_subruns': 10,\n",
       " 'bin_pointwise': False,\n",
       " 'separate_response_channels': False,\n",
       " 'smooth_unif': True}"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "my_dataset_generator.generator_config"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "simulation round: 1  of 10\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "simulation round: 2  of 10\n",
      "simulation round: 3  of 10\n",
      "simulation round: 4  of 10\n",
      "simulation round: 5  of 10\n",
      "simulation round: 6  of 10\n",
      "simulation round: 7  of 10\n",
      "simulation round: 8  of 10\n",
      "simulation round: 9  of 10\n",
      "simulation round: 10  of 10\n"
     ]
    }
   ],
   "source": [
    "training_data = my_dataset_generator.generate_data_training_uniform(save=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`training_data` is a dictionary containing four keys:\n",
    "\n",
    "1. `data` the features for [LANs](https://elifesciences.org/articles/65074), containing vectors of *model parameters*, as well as *rts* and *choices*.\n",
    "2. `labels` which contain approximate likelihood values\n",
    "3. `generator_config`, as defined above\n",
    "4. `model_config`, as defined above"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can now use this training data for your purposes. If you want to train [LANs](https://elifesciences.org/articles/65074) yourself, you might find the [LANfactory](https://github.com/AlexanderFengler/LANfactory) package helpful.\n",
    "\n",
    "You may also simply find the basic simulators provided with the **ssm-simulators** package useful, without any desire to use the outputs into training data for amortization purposes.\n",
    "\n",
    "##### END"
   ]
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "c2404e761a8d4e2a34f63613cf4c9a9997cd3109cabb959a7904b2035989131a"
  },
  "kernelspec": {
   "display_name": "ssms_dev",
   "language": "python",
   "name": "ssms_dev"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  },
  "orig_nbformat": 2
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
